home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 7: Sunsite / Linux Cubed Series 7 - Sunsite Vol 1.iso / system / emulator / uae-0.000 / uae-0 / uae-0.6.0 / debug.c < prev    next >
C/C++ Source or Header  |  1996-06-12  |  5KB  |  220 lines

  1.  /* 
  2.   * UAE - The Un*x Amiga Emulator
  3.   * 
  4.   * Debugger
  5.   * 
  6.   * (c) 1995 Bernd Schmidt
  7.   * 
  8.   */
  9.  
  10. #include "sysconfig.h"
  11. #include "sysdeps.h"
  12.  
  13. #include <ctype.h>
  14. #include <signal.h>
  15.  
  16. #include "config.h"
  17. #include "options.h"
  18. #include "debug.h"
  19. #include "memory.h"
  20. #include "custom.h"
  21. #include "newcpu.h"
  22. #include "cia.h"
  23. #include "xwin.h"
  24. #include "gui.h"
  25.  
  26. #ifdef __cplusplus
  27. static RETSIGTYPE sigbrkhandler(...)
  28. #else
  29. static RETSIGTYPE sigbrkhandler(int foo)
  30. #endif
  31. {
  32.     broken_in = 1;
  33.     specialflags |= SPCFLAG_BRK;
  34.     signal(SIGINT, sigbrkhandler);
  35. }
  36.  
  37. static void ignore_ws(char **c)
  38. {
  39.     while (**c && isspace(**c)) (*c)++;
  40. }
  41.  
  42. static ULONG readhex(char **c)
  43. {
  44.     ULONG val = 0;
  45.     char nc;
  46.  
  47.     ignore_ws(c);
  48.     
  49.     while (isxdigit(nc = **c)){
  50.     (*c)++;
  51.     val *= 16;
  52.     nc = toupper(nc);
  53.     if (isdigit(nc)) {
  54.         val += nc - '0';
  55.     } else {
  56.         val += nc - 'A' + 10;
  57.     }
  58.     }
  59.     return val;
  60. }
  61.  
  62. static char next_char(char **c)
  63. {
  64.     ignore_ws(c);
  65.     return *(*c)++;
  66. }
  67.  
  68. static int more_params(char **c)
  69. {
  70.     ignore_ws(c);
  71.     return (**c) != 0;
  72. }
  73.  
  74. static void dumpmem(CPTR addr, CPTR *nxmem, int lines)
  75. {
  76.     broken_in = 0;
  77.     for (;lines-- && !broken_in;){
  78.     int i;
  79.     printf("%08lx ", addr);
  80.     for(i=0; i< 16; i++) {
  81.         printf("%04x ", get_word(addr)); addr += 2;
  82.     }
  83.     printf("\n");
  84.     }
  85.     *nxmem = addr;
  86. }
  87.  
  88. void debug(void)
  89. {
  90.     char input[80],c;
  91.     CPTR nextpc,nxdis,nxmem;
  92.     
  93.     if (debuggable()) {
  94. #if defined(__unix) && !defined(__NeXT__)
  95.     struct sigaction sa;
  96.     sa.sa_handler = sigbrkhandler;
  97. #ifdef SA_RESTART
  98.     sa.sa_flags = SA_RESTART;
  99. #endif
  100.     sigemptyset(&sa.sa_mask);
  101.         sigaction(SIGINT, &sa, NULL);
  102. #else
  103.     signal(SIGINT, sigbrkhandler);
  104. #endif
  105.     }
  106.     if (!debuggable() || !use_debugger) {
  107.     MC68000_run();
  108.     if (!debuggable()) {        
  109.         dumpcustom();
  110.         return;
  111.     }
  112.     }
  113.     
  114.     if (quit_program)
  115.     return;
  116.  
  117.     printf("debugging...\n");
  118.     MC68000_dumpstate(&nextpc);
  119.     nxdis = nextpc; nxmem = 0;
  120.     for(;;){
  121.     char cmd,*inptr;
  122.     
  123.     if (quit_program)
  124.         return;
  125.  
  126.     bogusframe = 1;
  127.     printf(">");
  128.     fgets(input, 80, stdin);
  129.     inptr = input;
  130.     cmd = next_char(&inptr);
  131.     switch(cmd){
  132.      case 'q': 
  133.         return;
  134.      case 'c':
  135.         dumpcia(); dumpcustom(); 
  136.         break;
  137.      case 'r':
  138.         MC68000_dumpstate(&nextpc);
  139.         break;
  140.      case 'd': 
  141.         {
  142.         ULONG daddr;
  143.         int count;
  144.         
  145.         if (more_params(&inptr))
  146.             daddr = readhex(&inptr);
  147.         else 
  148.             daddr = nxdis;
  149.         if (more_params(&inptr))
  150.             count = readhex(&inptr); 
  151.         else
  152.             count = 10;
  153.         MC68000_disasm(daddr, &nxdis, count);
  154.         }
  155.         break;
  156.      case 't': 
  157.         MC68000_step(); 
  158.         MC68000_dumpstate(&nextpc); 
  159.         break;
  160.      case 'z': 
  161.         MC68000_skip(nextpc);
  162.         MC68000_dumpstate(&nextpc);
  163.         nxdis = nextpc; 
  164.         break;
  165.      case 'f': 
  166.         MC68000_skip(readhex(&inptr));
  167.         MC68000_dumpstate(&nextpc); 
  168.         break;
  169.      case 'g':
  170.         if (more_params (&inptr))
  171.         m68k_setpc (readhex (&inptr));
  172.         MC68000_run();
  173.         MC68000_dumpstate(&nextpc);
  174.         break;
  175.      case 'm':
  176.         {
  177.         ULONG maddr; int lines;
  178.         if (more_params(&inptr))
  179.             maddr = readhex(&inptr); 
  180.         else 
  181.             maddr = nxmem;
  182.         if (more_params(&inptr))
  183.             lines = readhex(&inptr); 
  184.         else 
  185.             lines = 16;
  186.         dumpmem(maddr, &nxmem, lines);
  187.         }
  188.         break;
  189.           case 'h':
  190.           case '?':
  191.         {
  192.              printf ("          HELP for UAE Debugger\n");
  193.              printf ("         -----------------------\n\n");
  194.              printf ("  g: <address>          ");
  195.                 printf("Start execution at the current address or <address>.\n");
  196.              printf ("  c:                    ");
  197.                 printf("Dump state of the CIA and custom chips.\n");
  198.              printf ("  r:                    ");
  199.                 printf("Dump state of the CPU\n");
  200.              printf ("  m <address> <lines>:  ");
  201.                 printf ("Memory dump starting at <address>\n");
  202.              printf ("  d <address> <lines>:  ");
  203.                 printf ("Disassembly starting at <address>\n");
  204.              printf ("  t:                    ");
  205.                 printf ("Step one instruction\n");
  206.              printf ("  z:                    ");
  207.                 printf ("Step through one instruction - useful for JSR, DBRA etc\n");
  208.              printf ("  f <address>:          ");
  209.                 printf ("Step forward until PC == <address>\n");
  210.              printf ("  h,?:                  ");
  211.                 printf ("Show this help page\n");
  212.              printf ("  q:                    ");
  213.                 printf ("Quit the emulator. You don't want to use this command.\n\n");
  214.             }
  215.             break;
  216.              
  217.     }
  218.     }
  219. }
  220.